package com.cskaoyan.javse.oop3._2inner._4loacl._0introduction;

/**
 * @description: 局部内部类的基本特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 局部内部类是定义在一个方法或者一个作用域里面的类
 * > 它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
 * > 将局部内部类看成是局部变量即可
 *
 * 明确以上可以将局部内部类看成,局部变量,实际上局部内部类就很好学习了
 * 语法(以方法中的局部内部类为案例):
 *      class 类名{
 *          //类体
 *      }
 * 再具体了解局部内部类的特点之前,先明确几个重要的点:
 *      1.局部内部类是一种比成员内部类更加极致封装思想的体现,成员内部类在成员位置,类中都是可以访问到它的,但是
 *          局部内部类一旦出了作用域/方法等就不再生效了
 *
 *      2.局部内部类想要类加载,必须在方法内部创建它的对象,并且该方法还需要被调用
 *          并且局部内部类是没有静态声明的,不能依赖访问静态成员触发类加载(类似于成员内部类)
 *
 *      3.局部内部类的使用会显著增加代码层级,会代码变得不可读,所以如无必要不要使用局部内部类
 *      什么时候应该使用局部内部类?
 *      如果你在局部位置碰到问题.希望有一个对象能够解决问题,需要定义一个类,同时又希望该类不被外界所感知,仅在方法内部生效,就可以使用局部内部类
 *      而实际上使用局部内部类也可以一定程度上简化代码,简化流程,是偷懒的必备
 *
 *
 * 局部内部类自身的特点
 * 1，访问权限修饰符
 *      局部内部类相当于局部变量,它不需要访问权限修饰符,它的作用范围已经被方法/代码块等限制死了
 *      并且它也没有static声明
 *
 * 2，成员特点
 *      和成员内部类是一样的,没有static声明,别的和普通类一致
 *
 * 3，定义位置
 *      只要是局部位置定义的类,都是局部内部类
 *
 * 4，继承和实现
 *      局部内部类在相当多的场景中都是为了继承和实现而诞生的
 *
 *
 */
public class Demo {
    public static void main(String[] args) {

    }
}

class EnclosedClazz {
    //定义一个成员方法
    public void test() {
        //定义局部内部类
        class LocalInner {
            int a;
            private int b = 10;

            //static int c=10;
            //static final String STRING = new String("aaa");
            public void test() {
            }

            //public static void test(){}
            //static {}
            {
            }

            public LocalInner() {
            }

            public LocalInner(int a, int b) {
                this.a = a;
                this.b = b;
            }
        }

    }
}
